package com.zenithmind.chat.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.zenithmind.chat.mapper.ChatMessageMapper;
import com.zenithmind.chat.pojo.dto.ChatMessageDTO;
import com.zenithmind.chat.pojo.entity.ChatMessage;
import com.zenithmind.chat.pojo.query.ChatMessageQuery;
import com.zenithmind.chat.pojo.vo.ChatMessageVO;
import com.zenithmind.chat.pojo.vo.ChatUserVO;
import com.zenithmind.common.result.PageResult;

import java.util.List;

/**
 * 聊天消息服务接口
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
public interface ChatMessageService extends IService<ChatMessage> {

    /**
     * 分页查询消息列表
     * 
     * @param query 查询条件
     * @param userId 当前用户ID
     * @return 分页结果
     */
    PageResult<ChatMessageVO> getMessagePage(ChatMessageQuery query, String userId);

    /**
     * 获取群组消息列表
     * 
     * @param groupId 群组ID
     * @param userId 当前用户ID
     * @param lastMessageId 最后消息ID（用于分页）
     * @param limit 限制数量
     * @return 消息列表
     */
    List<ChatMessageVO> getGroupMessages(String groupId, String userId, String lastMessageId, Integer limit);

    /**
     * 根据ID获取消息详情
     * 
     * @param id 消息ID
     * @param userId 当前用户ID
     * @return 消息详情
     */
    ChatMessageVO getMessageById(String id, String userId);

    /**
     * 发送消息
     * 
     * @param messageDTO 消息DTO
     * @param userId 发送者ID
     * @return 消息ID
     */
    String sendMessage(ChatMessageDTO messageDTO, String userId);

    /**
     * 撤回消息
     * 
     * @param id 消息ID
     * @param userId 操作者ID
     * @param reason 撤回原因
     * @return 是否成功
     */
    Boolean recallMessage(String id, String userId, String reason);

    /**
     * 删除消息
     * 
     * @param id 消息ID
     * @param userId 操作者ID
     * @return 是否成功
     */
    Boolean deleteMessage(String id, String userId);

    /**
     * 批量删除消息
     * 
     * @param ids 消息ID列表
     * @param userId 操作者ID
     * @return 是否成功
     */
    Boolean deleteMessagesBatch(List<String> ids, String userId);

    /**
     * 置顶消息
     * 
     * @param id 消息ID
     * @param userId 操作者ID
     * @return 是否成功
     */
    Boolean pinMessage(String id, String userId);

    /**
     * 取消置顶消息
     * 
     * @param id 消息ID
     * @param userId 操作者ID
     * @return 是否成功
     */
    Boolean unpinMessage(String id, String userId);

    /**
     * 点赞消息
     * 
     * @param id 消息ID
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean likeMessage(String id, String userId);

    /**
     * 取消点赞消息
     * 
     * @param id 消息ID
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean unlikeMessage(String id, String userId);

    /**
     * 标记消息为已读
     * 
     * @param messageIds 消息ID列表
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean markMessagesAsRead(List<String> messageIds, String userId);

    /**
     * 标记群组所有消息为已读
     * 
     * @param groupId 群组ID
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean markGroupMessagesAsRead(String groupId, String userId);

    /**
     * 获取消息已读用户列表
     * 
     * @param messageId 消息ID
     * @return 已读用户列表
     */
    List<ChatUserVO> getMessageReadUsers(String messageId);

    /**
     * 获取消息未读用户列表
     * 
     * @param messageId 消息ID
     * @return 未读用户列表
     */
    List<ChatUserVO> getMessageUnreadUsers(String messageId);

    /**
     * 搜索消息
     * 
     * @param groupId 群组ID
     * @param keyword 搜索关键词
     * @param messageType 消息类型
     * @param senderId 发送者ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param limit 限制数量
     * @return 消息列表
     */
    List<ChatMessageVO> searchMessages(String groupId, String keyword, Integer messageType, 
                                      String senderId, String startTime, String endTime, Integer limit);

    /**
     * 获取置顶消息列表
     * 
     * @param groupId 群组ID
     * @return 置顶消息列表
     */
    List<ChatMessageVO> getPinnedMessages(String groupId);

    /**
     * 获取@我的消息
     * 
     * @param userId 用户ID
     * @param groupId 群组ID（可选）
     * @param isRead 是否已读（可选）
     * @return 消息列表
     */
    List<ChatMessageVO> getMentionMessages(String userId, String groupId, Boolean isRead);

    /**
     * 获取用户未读消息数量
     * 
     * @param groupId 群组ID
     * @param userId 用户ID
     * @return 未读数量
     */
    Integer getUnreadMessageCount(String groupId, String userId);

    /**
     * 获取群组最新消息
     * 
     * @param groupId 群组ID
     * @param userId 当前用户ID
     * @return 最新消息
     */
    ChatMessageVO getLatestMessage(String groupId, String userId);

    /**
     * 发送系统消息
     * 
     * @param groupId 群组ID
     * @param content 消息内容
     * @param messageType 消息类型
     * @return 消息ID
     */
    String sendSystemMessage(String groupId, String content, Integer messageType);

    /**
     * 转发消息
     * 
     * @param messageId 原消息ID
     * @param targetGroupIds 目标群组ID列表
     * @param userId 转发者ID
     * @return 是否成功
     */
    Boolean forwardMessage(String messageId, List<String> targetGroupIds, String userId);

    /**
     * 获取消息统计信息
     * 
     * @param groupId 群组ID（可选）
     * @param startTime 开始时间（可选）
     * @param endTime 结束时间（可选）
     * @return 统计信息
     */
    Object getMessageStatistics(String groupId, String startTime, String endTime);

    /**
     * 清理过期消息
     * 
     * @param days 保留天数
     * @return 清理数量
     */
    Integer cleanExpiredMessages(Integer days);

    /**
     * 检查消息发送权限
     * 
     * @param groupId 群组ID
     * @param userId 用户ID
     * @return 是否有权限
     */
    Boolean checkSendPermission(String groupId, String userId);
}
